package cn.spdb.harrier.server.utils;

import java.io.File;
import java.time.LocalDateTime;
import java.util.Date;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

import ch.ethz.ssh2.SCPClient;
import cn.spdb.harrier.common.enmus.DownLoadResourceProtocol;
import cn.spdb.harrier.common.utils.DateUtils;
import cn.spdb.harrier.common.utils.FileUtils;
import cn.spdb.harrier.common.utils.HttpUtils;
import cn.spdb.harrier.common.utils.IPUtils;
import cn.spdb.harrier.common.utils.SshUtils;
import cn.spdb.harrier.common.utils.URI;
import cn.spdb.harrier.dao.entity.UdsServer;
import cn.spdb.harrier.dao.utils.BeanContext;
import cn.spdb.harrier.rpc.transport.File.FileManager;
import cn.spdb.harrier.server.entity.JobStepBean;
import cn.spdb.harrier.server.worker.WorkerManagerThread;
import cn.spdb.harrier.service.aws.AwsUtils;

public class ResourceDownUtils {

	public static Boolean downloadResource(JobStepBean step) {
		try {
			if (ObjectUtils.isEmpty(step.getStepUri())
					|| "local".equals(step.getStepUri().getProtocol()) && StringUtils.isBlank(step.getStepPath())) {
				return true;
			}
			if (!"local".equals(step.getStepUri().getProtocol())) {
				File file = new File(step.getStepPath());
				if (file.exists()) {
					long ms = file.lastModified();
					LocalDateTime fixLd = DateUtils.date2LocalDateTime(new Date(ms));
					LocalDateTime updateTime = step.getUpdateTime();
					if (updateTime.compareTo(fixLd) < 0) {
						return true;
					} else {
						File destFile = new File(file.getPath() + "_old");
						if (destFile.exists()) {
							destFile.delete();
						}
						FileUtils.copyFile(file, destFile);
						file.delete();
					}
				}
			}
			return downloadResource(step.getStepUri());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

/**
 * 根据给定的 URI 下载资源，支持多种协议（SPDB、SCP、HTTP/HTTPS、AWS 等）
 *
 * @param stepURI 资源 URI，包含协议、地址和路径信息
 * @return 下载是否成功
 */
public static Boolean downloadResource(URI stepURI) {
    try {
        if (ObjectUtils.isEmpty(stepURI) || StringUtils.isBlank(stepURI.getPath())) {
            return false; // 参数校验失败
        }

        // 根据 URI 中的协议类型选择对应的下载方式
        switch (DownLoadResourceProtocol.valueNaeOf(stepURI.getProtocol())) {

            case SPDB:
                // 如果没有指定主机地址，则从 WorkerManagerThread 获取主节点
                if (StringUtils.isEmpty(stepURI.getAddress())) {
                    UdsServer server = BeanContext.getBean(WorkerManagerThread.class).getLeaderMaster();
                    if (ObjectUtils.isEmpty(server)) {
                        return false; // 主节点为空则无法下载
                    }
                    // 设置 URI 的 IP 和端口
                    stepURI = stepURI.setHost(server.getIp());
                    stepURI = stepURI.setPort(server.getPort());
                }

                // 如果是本地地址，直接返回成功
                if (IPUtils.getHostIp().equals(stepURI.getHost())) {
                    return true;
                }

                // 使用 FileManager 进行文件传输下载
                return FileManager.getInstance().loadFile(stepURI, stepURI.getPath(), true);

            case SCP:
                // 使用 SSH/SCP 协议下载文件
                return SshUtils.load(stepURI, stepURI.getPath(), stepURI.getPath());

            case HTTP:
            case HTTPS:
                // 通过 HTTP(S) 协议下载文件
                return HttpUtils.downLoadFormUrl(stepURI.toString(), stepURI.getPath());

            case AWS:
                // 从 AWS 下载文件
                return AwsUtils.load(stepURI, stepURI.getPath());

            default:
                // 默认认为资源已经在本地存在
                return FileUtils.isFileAndExists(stepURI.getPath());
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}


}
